import stylegen from '@maplibre/maplibre-gl-inspect/lib/stylegen'
import colors from '@maplibre/maplibre-gl-inspect/lib/colors'
import type {FilterSpecification,LayerSpecification } from 'maplibre-gl'

export type HighlightedLayer = LayerSpecification & {filter?: FilterSpecification};

function changeLayer(l: HighlightedLayer, layer: LayerSpecification) {
  if(l.type === 'circle') {
    l.paint!['circle-radius'] = 3
  } else if(l.type === 'line') {
    l.paint!['line-width'] = 2
  }

  if("filter" in layer) {
    l.filter = layer.filter
  } else {
    delete l['filter']
  }
  l.id = l.id + '_highlight'
  return l
}

export function colorHighlightedLayer(layer?: LayerSpecification): HighlightedLayer | null {
  if(!layer || layer.type === 'background' || layer.type === 'raster') return null

  const sourceLayerId = layer['source-layer'] || ''
  const color = colors.brightColor(sourceLayerId, 1);

  if(layer.type === "fill" || layer.type === 'fill-extrusion') {
    return changeLayer(stylegen.polygonLayer(color, color, layer.source, layer['source-layer']), layer)
  }

  if(layer.type === "symbol" || layer.type === 'circle') {
    return changeLayer(stylegen.circleLayer(color, layer.source, layer['source-layer']), layer)
  }

  if(layer.type === 'line') {
    return changeLayer(stylegen.lineLayer(color, layer.source, layer['source-layer']), layer)
  }

  return null
}
